package igrupobbva.pe.sistemareniec.actions;

/*
 * Created on 15-jul-2009
 *
 */


import igrupobbva.pe.sistemareniec.forms.ReporteExcelForm;
import igrupobbva.pe.sistemareniec.util.ReporteExcelBean;

import java.io.BufferedOutputStream;
import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.grupobbva.iici.serializable.Corporativa;
import com.grupobbva.iici.serializable.Log;
import com.grupobbva.iici.serializable.LogDto;
import com.grupobbva.iici.serializable.Oficina;
import com.grupobbva.iici.service.CorporativaService;
import com.grupobbva.iici.service.LogService;
import com.grupobbva.iici.service.OficinaService;
import com.grupobbva.iici.util.ConstantesUtil;
import com.grupobbva.iici.util.SpringUtils;

/**
 * @author tgagliuffi
 *
 */
public class ExpotarExcelAction extends DispatchAction {
	String flag=null;
	private String fileOuput = "";
	
	LogService logService;
	OficinaService oficinaService;
	CorporativaService corporativaService;
	public ActionForward inicio(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	throws Exception {
		ActionErrors errors = new ActionErrors();
		ActionForward forward = new ActionForward();
		corporativaService=SpringUtils.getBean(request, CorporativaService.class);
		try {
			request.removeAttribute("prueba");
			request.getSession().setAttribute("listaServicio",corporativaService.obtenerCatalogoMultitabla("T07"));
			request.getSession().setAttribute("listaAplicativo",corporativaService.obtenerCatalogoMultitabla("T08"));
			System.out.println("3*-Entra al metodo de inicio de action ExportarExcel");		
			
		} catch (Exception e) {
			errors.add("name", new ActionError("id"));
		}
		if (!errors.isEmpty()) {
			saveErrors(request, errors);
			forward = mapping.findForward("error");
		} else {
			forward = mapping.findForward("inicio");
			
		}
		return (forward);
		
	}
	
	
	public ActionForward exportar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		ReporteExcelForm filtro = (ReporteExcelForm) form;
		ActionForward forward = new ActionForward();
		ActionErrors errors = new ActionErrors();
		
		String flag = "1";
		String flagWindow = "1";
		int test =0;
		String codOficina ="";
		
		String fecIni 			= request.getParameter("fecInicio");
		String fecFin 			= request.getParameter("fecFinal");
		codOficina 				= request.getParameter("str_num_oficina");
		
		String registro			= request.getParameter("registro");
		String aplicativo		= request.getParameter("aplicativo");
		String codigoServicio	= request.getParameter("codigoServicio");
		
		
		ReporteExcelBean reporteExcelBean = new ReporteExcelBean();
		logService=SpringUtils.getBean(request, LogService.class);
		oficinaService=SpringUtils.getBean(request, OficinaService.class);
		corporativaService=SpringUtils.getBean(request, CorporativaService.class);
		/*String fecIni, 
		String fecFin, 
		String codigoOficina,
		String registro,
		String aplicativo,
		String codigoServicio*/
		LogDto log = new LogDto();
		List<LogDto> lista = logService.obtenerTodosLog(fecIni, fecFin, codOficina,registro,aplicativo,codigoServicio);
		//	Estilos estilosExcel = new Estilos();
		
		String cadena="";
		int sumaGrupo= 0;
		int sumaTotal=0;
		double importeConsultas;
		String textTemp=null;
		String nomTemp = "";
		Log logtemp = null;
		int contaConsultas = 0;
		double tar = 0.0;
		String rootCarpetaReportes  = "C:/";
		List<Corporativa> lstCorporativa=corporativaService.obtenerCatalogoMultitabla("T02");
		SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");
		
		HSSFWorkbook libro = new HSSFWorkbook();
		if(lista!=null){
			String strArchivo = "ReporteConsultasReniec.xls";
			this.fileOuput = rootCarpetaReportes + strArchivo;
			response.setContentType("iso-8859-1");
			response.setHeader("Content-Disposition","attachment; filename="+strArchivo);
			
			//	HSSFWorkbook libro = new HSSFWorkbook();
			HSSFSheet hoja = libro.createSheet();
			
			HSSFRichTextString texto;
			HSSFRow fila;
			HSSFCell celda ;
			
			HSSFCellStyle estiloCelda = libro.createCellStyle();
			HSSFCellStyle estiloTitulo = libro.createCellStyle();
			HSSFCellStyle estiloCabecera = libro.createCellStyle();
			HSSFCellStyle estiloDatos = libro.createCellStyle();
			HSSFFont f = libro.createFont();
			
			createStyles(estiloTitulo, estiloCabecera, estiloDatos, f);
			
			fila = hoja.createRow(1);
			
			celda = fila.createCell((short) 3);
			texto = new HSSFRichTextString("REPORTE DE CONSULTAS AL SISTEMA RENIEC");
			celda.setCellValue(texto);
			celda.setCellStyle(estiloCabecera);
			
			
			
			fila = hoja.createRow(2);
			celda = fila.createCell((short) 2);
			texto = new HSSFRichTextString("");
			celda.setCellValue(texto);
			
			fila = hoja.createRow(3);
			
			celda = fila.createCell((short) 1);
			texto = new HSSFRichTextString("Fecha:");
			celda.setCellValue(texto);
			celda.setCellStyle(estiloCabecera);
			
			celda = fila.createCell((short) 2);
			texto = new HSSFRichTextString("Del "+fecIni+" al "+fecFin);
			celda.setCellValue(texto);
			celda.setCellStyle(estiloDatos);
			
			fila = hoja.createRow(4);
			
			celda = fila.createCell((short) 1);
			texto = new HSSFRichTextString("Oficina:");
			celda.setCellValue(texto);
			celda.setCellStyle(estiloCabecera);
			
			celda = fila.createCell((short) 2);
			texto = new HSSFRichTextString(codOficina!=null&&!(codOficina.equals(""))?codOficina:"Todos");
			celda.setCellValue(texto);
			celda.setCellStyle(estiloDatos);
			
			celda = fila.createCell((short) 4);
			texto = new HSSFRichTextString("Tipo Consulta :");
			celda.setCellValue(texto);
			celda.setCellStyle(estiloCabecera);
			
			celda = fila.createCell((short) 5);
			texto = new HSSFRichTextString(codigoServicio!=null&&!(codigoServicio.equals(""))?codigoServicio:"Todos");
			celda.setCellValue(texto);
			celda.setCellStyle(estiloDatos);

			fila = hoja.createRow(5);
			
			celda = fila.createCell((short) 1);
			texto = new HSSFRichTextString("Consultante:");
			celda.setCellValue(texto);
			celda.setCellStyle(estiloCabecera);
			
			celda = fila.createCell((short) 2);
			texto = new HSSFRichTextString(registro!=null&&!(registro.equals(""))?registro:"Todos");
			celda.setCellValue(texto);
			celda.setCellStyle(estiloDatos);
			
			celda = fila.createCell((short) 4);
			texto = new HSSFRichTextString("Aplicacion :");
			celda.setCellValue(texto);
			celda.setCellStyle(estiloCabecera);
			
			celda = fila.createCell((short) 5);
			texto = new HSSFRichTextString(aplicativo!=null&&!(aplicativo.equals(""))?aplicativo:"Todos");
			celda.setCellValue(texto);
			celda.setCellStyle(estiloDatos);

			int currentRow=8;
			
			
			
			for(int x=0; x<lista.size(); x++){
				log = ((LogDto) lista.get(x));		     	
				if(x==0){
					//pintado las cabeceras de las filas 
					fila = hoja.createRow(currentRow);
					//aumenta el current para crear una fila mas
					currentRow++; // valor de currentRow = 5
					//creando la primero celda dentro del 4ta fila
					celda = fila.createCell((short) 0);
					String tempNom  = log.getNombreOficina();

					texto = new HSSFRichTextString("MES ");
					celda.setCellStyle(estiloCabecera);
					celda.setCellValue(texto);
					
					celda = fila.createCell((short) 1);
					
					texto = new HSSFRichTextString("COD. OFICINA");
					celda.setCellStyle(estiloCabecera);
					celda.setCellValue(texto);
					
					//fila = hoja.createRow(currentRow);
					//currentRow++;
					celda = fila.createCell((short) 2);
					texto = new HSSFRichTextString("DESCRIPCION OFICINA");
					celda.setCellStyle(estiloCabecera);
					celda.setCellValue(texto);
					
					
					celda = fila.createCell((short) 3);
					texto = new HSSFRichTextString("REGISTRO CONSULTANTE");
					celda.setCellStyle(estiloCabecera);
					celda.setCellValue(texto);
					
					
					celda = fila.createCell((short) 4);
					texto = new HSSFRichTextString("NOMBRE Y APELLIDOS CONSULTANTE");
					celda.setCellStyle(estiloCabecera);
					celda.setCellValue(texto);
					
					
					celda = fila.createCell((short) 5);
					texto = new HSSFRichTextString("NRO CONSULTAS");
					celda.setCellValue(texto);
					celda.setCellStyle(estiloCabecera);
					
				}
				
				
				fila = hoja.createRow(currentRow);
				currentRow++;
				
				celda = fila.createCell((short) 0);				
				texto = new HSSFRichTextString(log.getMes());
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				sumaGrupo += log.getNroConsultas();
				
				celda = fila.createCell((short) 1);				
				texto = new HSSFRichTextString(log.getCodigoOficina());
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				celda = fila.createCell((short) 2);				
				texto = new HSSFRichTextString(log.getNombreOficina());
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				celda = fila.createCell((short) 3);				
				texto = new HSSFRichTextString(log.getRegistro());
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				celda = fila.createCell((short) 4);				
				texto = new HSSFRichTextString(log.getNombreCompleto());
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				celda = fila.createCell((short) 5);				
				texto = new HSSFRichTextString(log.getNroConsultas()+"");
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				/*celda = fila.createCell((short) 1);
				texto = new HSSFRichTextString(log.getStr_num_registro());
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				celda = fila.createCell((short) 2);
				texto = new HSSFRichTextString(log.getStr_nom_completo());
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				celda = fila.createCell((short) 3);
				texto = new HSSFRichTextString(sdf.format(log.getStr_fec_consulta()));
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				celda = fila.createCell((short) 4);
				texto = new HSSFRichTextString(log.getStr_tipo());
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				celda = fila.createCell((short) 5);
				texto = new HSSFRichTextString(literalCanal(log.getStr_canal()));
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				
				if(x+1<lista.size()){
					logtemp=(Log)lista.get(x+1);
					textTemp=logtemp.getStr_num_oficina();
					//nomTemp = (logtemp.getStr_des_oficina()!= null ? logtemp.getStr_des_oficina() : nomTemp);
					Oficina oficina=oficinaService.obtenerEntidadPorCodigo(Oficina.class, logtemp.getStr_num_oficina());
					nomTemp = (oficina != null ? oficina.getNom_oficina(): "");
				}else{
					//nomTemp = conexion.findIdOficina(logtemp.getStr_num_oficina()).getNom_oficina();
					textTemp="FIN";
				}
				if(!(log.getStr_num_oficina().equals(textTemp))){
					
					fila = hoja.createRow(currentRow);
					currentRow=currentRow+2;
					
					celda = fila.createCell((short) 0);
					texto = new HSSFRichTextString(Integer.toString(sumaGrupo));
					
					sumaGrupo=0;
					celda.setCellValue(texto);
					celda.setCellStyle(estiloDatos);
					celda = fila.createCell((short) 1);
					texto = new HSSFRichTextString("TOTAL CONSULTAS");
					celda.setCellValue(texto);
					celda.setCellStyle(estiloCabecera);
					
					if(!(textTemp.equals("FIN"))){
						fila = hoja.createRow(currentRow);
						currentRow++;
						celda = fila.createCell((short) 0);
						texto = new HSSFRichTextString("OFICINA : " + nomTemp); 
						celda.setCellValue(texto);
						celda.setCellStyle(estiloCabecera);
						
						celda = fila.createCell((short) 1);
						texto = new HSSFRichTextString("CODIGO DE OFICINA : " + textTemp); 
						celda.setCellValue(texto);
						celda.setCellStyle(estiloCabecera);
						
						fila = hoja.createRow(currentRow);
						currentRow++;
						
						celda = fila.createCell((short) 0);
						texto = new HSSFRichTextString("NUMERO DE CONSULTAS");
						celda.setCellValue(texto);
						celda.setCellStyle(estiloCabecera);
						
						celda = fila.createCell((short) 1);
						texto = new HSSFRichTextString("REGISTRO");
						celda.setCellValue(texto);
						celda.setCellStyle(estiloCabecera);
						
						celda = fila.createCell((short) 2);
						texto = new HSSFRichTextString("NOMBRE Y APELLIDOS");
						celda.setCellValue(texto);
						celda.setCellStyle(estiloCabecera);
						
						celda = fila.createCell((short) 3);
						texto = new HSSFRichTextString("FECHA DE CONSULTA");
						celda.setCellValue(texto);
						celda.setCellStyle(estiloCabecera);
						
						celda = fila.createCell((short) 4);
						texto = new HSSFRichTextString("TIPO DE CONSULTA");
						celda.setCellValue(texto);
						celda.setCellStyle(estiloCabecera);
						
						celda = fila.createCell((short) 5);
						texto = new HSSFRichTextString("CANAL");
						celda.setCellValue(texto);
						celda.setCellStyle(estiloCabecera);
					}
				}
				
				
			}
			
			
			
			*/
			}
				importeConsultas = sumaGrupo * valorTarifa(sumaGrupo,lstCorporativa);
				
				currentRow = currentRow + 2;
				fila = hoja.createRow(currentRow);
				currentRow++;
				celda = fila.createCell((short) 0);
				texto = new HSSFRichTextString("Totales");
				celda.setCellValue(texto);
				celda.setCellStyle(estiloCabecera);
				
				fila = hoja.createRow(currentRow);
				currentRow++;
				celda = fila.createCell((short) 0);
				texto = new HSSFRichTextString("N de Consultas");
				celda.setCellValue(texto);
				celda.setCellStyle(estiloCabecera);
				
				celda = fila.createCell((short) 1);
				texto = new HSSFRichTextString("Importe");
				celda.setCellValue(texto);
				celda.setCellStyle(estiloCabecera);
				
				fila = hoja.createRow(currentRow);
				currentRow++;
				celda = fila.createCell((short) 0);
				texto = new HSSFRichTextString(Integer.toString(sumaGrupo));
				celda.setCellValue(texto);
				celda.setCellStyle(estiloDatos);
				
				celda = fila.createCell((short) 1);
				
				importeConsultas =  Math.round(importeConsultas*Math.pow(10,2))/Math.pow(10,2);  
				texto = new HSSFRichTextString(Double.toString(importeConsultas));
				celda.setCellValue(texto); 
				celda.setCellStyle(estiloDatos);
				hoja.autoSizeColumn((short)0);
				hoja.autoSizeColumn((short)1);
				hoja.autoSizeColumn((short)2);
				hoja.autoSizeColumn((short)3);
				hoja.autoSizeColumn((short)4);
				hoja.setDefaultColumnWidth((short)20);
			try {
				request.getSession().setAttribute("generaXLS", "SI_EXPORTAR");
				request.getSession().setAttribute("libro", libro);
				forward = mapping.findForward("inicio");		        	
				
				
			} catch (Exception e) {
				e.printStackTrace();
			}
			}
			
//		}else{
//			request.setAttribute("prueba", "prueba");
//			request.getSession().setAttribute("generaXLS", "NO_EXPORTAR");				
//			forward = mapping.findForward("inicio");
//		}
		
		return forward;
		
	}
	
	
	public double valorTarifa(int sumaT,List<Corporativa> listTarifas){
//		Vector listTarifas = conexion.findByCodMulti("T02");
		double tar = 0.0;
		for(int i=0; i<listTarifas.size(); i++){
			
			Corporativa cor = new Corporativa();
			cor = listTarifas.get(i);
			if(sumaT > Integer.parseInt(cor.getValor2()) && sumaT < Integer.parseInt(cor.getValor3()) ){
				tar = Double.parseDouble(cor.getValor4());
				
			}
			
		}
		return tar;
	}
	public ActionForward downloadFile(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	throws Exception {
		ActionErrors errors = new ActionErrors();
		ActionForward forward = new ActionForward();
		request.setAttribute("file", "ReporteConsultasReniec.xls");
		request.setAttribute("rootpath", this.fileOuput);
		
		
		try {
			
		} catch (Exception e) {
			errors.add("name", new ActionError("id"));
		}
		if (!errors.isEmpty()) {
			saveErrors(request, errors);
			forward = mapping.findForward("error");
		} else {
			forward = mapping.findForward("descarga");
		}	
		return (forward);
	}
	public int generaFichero(HSSFWorkbook libro, HttpServletResponse response){
		try {
			BufferedOutputStream elFichero = new BufferedOutputStream(response.getOutputStream());
			libro.write(elFichero);
			elFichero.close();
		} catch (Exception e) {
			e.getStackTrace();
		}
		
		return 0;
	}
	public void createStyles(HSSFCellStyle estiloTitulo,
			HSSFCellStyle estiloCabecera, HSSFCellStyle estiloDatos, HSSFFont f) {
		f.setFontHeightInPoints((short) 10);
		f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		f.setFontName(f.FONT_ARIAL);
		
		estiloTitulo.setFillPattern((short) HSSFCellStyle.SOLID_FOREGROUND);
		estiloTitulo.setFont(f);	
		
		
		estiloTitulo.setFillForegroundColor(HSSFColor.GOLD.index);
		estiloTitulo.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		estiloTitulo.setAlignment((short)HSSFCellStyle.ALIGN_CENTER);
		estiloTitulo.setWrapText(true);
		
		estiloCabecera.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
		estiloCabecera.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		estiloCabecera.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
		estiloCabecera.setBottomBorderColor((short)8);
		estiloCabecera.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
		estiloCabecera.setLeftBorderColor((short)8);
		estiloCabecera.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
		estiloCabecera.setRightBorderColor((short)8);
		estiloCabecera.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
		estiloCabecera.setTopBorderColor((short)8);
		estiloCabecera.setAlignment((short)HSSFCellStyle.ALIGN_CENTER);
		estiloCabecera.setWrapText(true);
		estiloCabecera.setVerticalAlignment((short)HSSFCellStyle.VERTICAL_CENTER);
		
		estiloDatos.setWrapText(true);
		estiloDatos.setAlignment((short)HSSFCellStyle.ALIGN_CENTER);
		estiloDatos.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
		estiloDatos.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		estiloDatos.setBottomBorderColor((short)8);
	}
	
	public static String nameFileOuput(String rootpath, String codigoUser) {
		Date fecha = new Date();
		java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("dd-MM-yyyy_hhmmss");
		String result = rootpath + codigoUser + "_" + format.format(fecha)
		+ ".txt";		
		return result;
	}
	
	
	
	private String literalCanal(String str_canal) {
		String res = "";
		
		if(str_canal!=null){
			if(str_canal.equals(ConstantesUtil.CANAL_INTRANET))
				res = ConstantesUtil.LIT_CANAL_INTRANET;
			else if(str_canal.equals(ConstantesUtil.CANAL_NACAC))
				res = ConstantesUtil.LIT_CANAL_NACAC;
			else if(str_canal.equals(ConstantesUtil.CANAL_VALIJAVIRTUAL))
				res = ConstantesUtil.LIT_CANAL_VALIJAVIRTUAL;
		}
		
		return res;
	}
	
}






